/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.catosist.run.business.gestorcomprobante;

import com.catosist.run.dataaccess.domain.ComprobanteDao;
import com.catosist.run.dataaccess.model.ClienteVO;
import com.catosist.run.dataaccess.model.ComprobanteVO;
import com.catosist.run.dataaccess.model.ResultadoVentaVO;
import com.catosist.run.dataaccess.model.ViajeVO;
import com.catosist.run.services.ClienteDTO;
import com.catosist.run.services.ComprobanteDTO;
import com.catosist.run.services.ResultadoVentaDTO;
import com.catosist.run.services.ViajeDTO;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 *
 * @author igorov
 */
public class GestorComprobanteImpl implements GestorComprobante{

    private ComprobanteDao comprobanteDao;
    private List<ComprobanteVO> comprobanteVOs;

    public List<ComprobanteDTO> getAllFacturas() {
        List<ComprobanteDTO> comprobanteDTOs = new LinkedList<ComprobanteDTO>();
//        try{
        List<ComprobanteVO> comprobanteVOs = comprobanteDao.getAllFacturas();
        for (Iterator<ComprobanteVO> it = comprobanteVOs.iterator(); it.hasNext();) {
            ComprobanteVO comprobanteVO = it.next();
            ComprobanteDTO comprobanteDTO = new ComprobanteDTO(comprobanteVO.getId(),
                    comprobanteVO.getFingreso(),
                    comprobanteVO.getNumero(),
                    comprobanteVO.getNumeroserie(),
                    comprobanteVO.getTotal(),
                    comprobanteVO.getCliente().getId(),
                    comprobanteVO.getCliente().getNombre(),
                    comprobanteVO.getCliente().getDireccion(),
                    comprobanteVO.getCliente().getRuc(),
                    comprobanteVO.getMonto(),
                    comprobanteVO.getIgv(),
                    comprobanteVO.getTotalsindetraccion(),
                    comprobanteVO.getDetraccion(),
                    comprobanteVO.getTipoComprobante(),
                    comprobanteVO.getFcancelacion(),
                    comprobanteVO.getAdelanto());
            if (comprobanteVO.getViaje() != null) {
                comprobanteDTO.setViaje(comprobanteVO.getViaje().getId());
            }
            comprobanteDTOs.add(comprobanteDTO);

        }
        return comprobanteDTOs;
    }

    public List<ComprobanteDTO> getAllBoletas() {
        List<ComprobanteDTO> comprobanteDTOs = new LinkedList<ComprobanteDTO>();
        List<ComprobanteVO> comprobanteVOs = comprobanteDao.getAllBoletas();
        for (Iterator<ComprobanteVO> it = comprobanteVOs.iterator(); it.hasNext();) {
            ComprobanteVO comprobanteVO = it.next();
            ComprobanteDTO comprobanteDTO = new ComprobanteDTO(comprobanteVO.getId(),
                    comprobanteVO.getFingreso(),
                    comprobanteVO.getNumero(),
                    comprobanteVO.getNumeroserie(),
                    comprobanteVO.getTotal(),
                    comprobanteVO.getCliente().getId(),
                    comprobanteVO.getCliente().getNombre(),
                    comprobanteVO.getCliente().getDireccion(),
                    comprobanteVO.getCliente().getRuc(),
                    comprobanteVO.getMonto(),
                    comprobanteVO.getIgv(),
                    comprobanteVO.getTotalsindetraccion(),
                    comprobanteVO.getDetraccion(),
                    comprobanteVO.getTipoComprobante(),
                    comprobanteVO.getFcancelacion(),
                    comprobanteVO.getAdelanto());
            if (comprobanteVO.getViaje() != null) {
                comprobanteDTO.setViaje(comprobanteVO.getViaje().getId());
            }
            comprobanteDTOs.add(comprobanteDTO);

        }
        return comprobanteDTOs;
    }

    public List<ComprobanteDTO> getAllContratos() {
        List<ComprobanteDTO> comprobanteDTOs = new LinkedList<ComprobanteDTO>();
        List<ComprobanteVO> comprobanteVOs = comprobanteDao.getAllContratos();
        for (Iterator<ComprobanteVO> it = comprobanteVOs.iterator(); it.hasNext();) {
            ComprobanteVO comprobanteVO = it.next();
            ComprobanteDTO comprobanteDTO = new ComprobanteDTO(comprobanteVO.getId(),
                    comprobanteVO.getFingreso(),
                    comprobanteVO.getNumero(),
                    comprobanteVO.getNumeroserie(),
                    comprobanteVO.getTotal(),
                    comprobanteVO.getCliente().getId(),
                    comprobanteVO.getCliente().getNombre(),
                    comprobanteVO.getCliente().getDireccion(),
                    comprobanteVO.getCliente().getRuc(),
                    comprobanteVO.getMonto(),
                    comprobanteVO.getIgv(),
                    comprobanteVO.getTotalsindetraccion(),
                    comprobanteVO.getDetraccion(),
                    comprobanteVO.getTipoComprobante(),
                    comprobanteVO.getFcancelacion(),
                    comprobanteVO.getAdelanto());
            if (comprobanteVO.getViaje() != null) {
                comprobanteDTO.setViaje(comprobanteVO.getViaje().getId());
            }
            comprobanteDTOs.add(comprobanteDTO);

        }
        return comprobanteDTOs;
    }




    public ComprobanteDao getComprobanteDao() {
        return comprobanteDao;
    }

    public void setComprobanteDao(ComprobanteDao comprobanteDao) {
        this.comprobanteDao = comprobanteDao;
    }

    public List<ComprobanteDTO> getByViajeId(int viajeId) {
        List<ComprobanteVO> comprobanteVOs = comprobanteDao.getByViajeId(viajeId);
        List<ComprobanteDTO> comprobanteDTOs = new LinkedList<ComprobanteDTO>();
        for (Iterator<ComprobanteVO> it = comprobanteVOs.iterator(); it.hasNext();) {
            ComprobanteVO comprobanteVO = it.next();
            ComprobanteDTO comprobanteDTO = new ComprobanteDTO(comprobanteVO.getId(),
                    comprobanteVO.getFingreso(),
                    comprobanteVO.getNumero(),
                    comprobanteVO.getNumeroserie(),
                    comprobanteVO.getTotal(),
                    comprobanteVO.getCliente().getId(),
                    comprobanteVO.getCliente().getNombre(),
                    comprobanteVO.getCliente().getDireccion(),
                    comprobanteVO.getCliente().getRuc(),
                    comprobanteVO.getMonto(),
                    comprobanteVO.getIgv(),
                    comprobanteVO.getTotalsindetraccion(),
                    comprobanteVO.getDetraccion(),
                    comprobanteVO.getTipoComprobante(),
                    comprobanteVO.getFcancelacion(),
                    comprobanteVO.getAdelanto());
            if (comprobanteVO.getViaje() != null) {
                comprobanteDTO.setViaje(comprobanteVO.getViaje().getId());
            }
            comprobanteDTOs.add(comprobanteDTO);

        }
        return comprobanteDTOs;
    }

    public void saveOrUpdate(ComprobanteDTO comprobanteDTO) {
        ClienteVO clienteVO = new ClienteVO();
        clienteVO.setId(comprobanteDTO.getClienteId());


        ComprobanteVO comprobanteVO = new ComprobanteVO();
        if(comprobanteDTO.getId() != 0)
            comprobanteVO.setId(comprobanteDTO.getId());
        comprobanteVO.setFingreso(comprobanteDTO.getFingreso());
        comprobanteVO.setNumero(comprobanteDTO.getNumero());
        comprobanteVO.setNumeroserie(comprobanteDTO.getNumeroserie());
        comprobanteVO.setCliente(clienteVO);
        comprobanteVO.setMonto(comprobanteDTO.getMonto());
        comprobanteVO.setIgv(comprobanteDTO.getIgv());
        comprobanteVO.setTotalsindetraccion(comprobanteDTO.getTotalsindetraccion());
        comprobanteVO.setDetraccion(comprobanteDTO.getDetraccion());
        comprobanteVO.setTotal(comprobanteDTO.getTotal());
        comprobanteVO.setTipoComprobante(comprobanteDTO.getTipo_comprobante());
        
        if (comprobanteDTO.getViaje() != -1) {
            ViajeVO viajeVO = new ViajeVO();
            viajeVO.setId(comprobanteDTO.getViaje());
            comprobanteVO.setViaje(viajeVO);
        }
        
        comprobanteVO.setFcancelacion(comprobanteDTO.getFcancelacion());
        if(comprobanteDTO.getFcancelacion() != null){
            comprobanteVO.setAdelanto(comprobanteDTO.getTotal());
        }
        if (comprobanteDTO.getAdelanto() != null) {
            comprobanteVO.setAdelanto(comprobanteDTO.getAdelanto());
        }

        comprobanteDao.saveOrUpdate(comprobanteVO);
    }

    

    public void deleteById(int i) {
        comprobanteDao.deleteById(i);
    }

    public void deleteByIndex(int index) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<ComprobanteDTO> getAll() {
//        updateListVo();
        List<ComprobanteDTO> comprobanteDTOs = new LinkedList<ComprobanteDTO>();
//        try{
        List<ComprobanteVO> comprobanteVOs = comprobanteDao.getAll();
        for (Iterator<ComprobanteVO> it = comprobanteVOs.iterator(); it.hasNext();) {
            ComprobanteVO comprobanteVO = it.next();
            ComprobanteDTO comprobanteDTO = new ComprobanteDTO(comprobanteVO.getId(),
                    comprobanteVO.getFingreso(),
                    comprobanteVO.getNumero(),
                    comprobanteVO.getNumeroserie(),
                    comprobanteVO.getTotal(),
                    comprobanteVO.getCliente().getId(),
                    comprobanteVO.getCliente().getNombre(),
                    comprobanteVO.getCliente().getDireccion(),
                    comprobanteVO.getCliente().getRuc(),
                    comprobanteVO.getMonto(),
                    comprobanteVO.getIgv(),
                    comprobanteVO.getTotalsindetraccion(),
                    comprobanteVO.getDetraccion(),
                    comprobanteVO.getTipoComprobante(),
                    comprobanteVO.getFcancelacion(),
                    comprobanteVO.getAdelanto());
            if (comprobanteVO.getViaje() != null) {
                comprobanteDTO.setViaje(comprobanteVO.getViaje().getId());
            }
            comprobanteDTOs.add(comprobanteDTO);

        }
        return comprobanteDTOs;
    }

    public ComprobanteDTO getById(int voId) {
        updateListVo();
        ComprobanteVO tmp = null;
        System.out.println("Id del vehiculo"+voId);
//        List<ComprobanteVO> comprobanteVOs = comprobanteDao.getAll();

        for (Iterator<ComprobanteVO> it = comprobanteVOs.iterator(); it.hasNext();) {
            ComprobanteVO comprobanteVO = it.next();
            System.out.println("id de uno de la lista "+comprobanteVO.getId());
            if (comprobanteVO.getId() == voId) {
                tmp = comprobanteVO;
                break;
            }
        }
        System.out.println("comprobante");
        System.out.println("comprobante; "+tmp.getCliente().getNombre());
        ComprobanteDTO comprobanteDTO = new ComprobanteDTO();
        comprobanteDTO.setId(tmp.getId());
        comprobanteDTO.setDireccionCliente(tmp.getCliente().getDireccion());
        comprobanteDTO.setFingreso(tmp.getFingreso());
        comprobanteDTO.setNombreCliente(tmp.getCliente().getNombre());
        comprobanteDTO.setNumero(tmp.getNumero());
        comprobanteDTO.setNumeroserie(tmp.getNumeroserie());
        comprobanteDTO.setClienteId(tmp.getCliente().getId());
        comprobanteDTO.setRUCCliente(tmp.getCliente().getRuc());
        comprobanteDTO.setTotal(tmp.getTotal());
        comprobanteDTO.setDetraccion(tmp.getDetraccion());
        comprobanteDTO.setIgv(tmp.getIgv());
        comprobanteDTO.setMonto(tmp.getMonto());
        comprobanteDTO.setTotalsindetraccion(tmp.getTotalsindetraccion());
        comprobanteDTO.setTipo_comprobante(tmp.getTipoComprobante());
        if (tmp.getViaje() != null) {
            comprobanteDTO.setViaje(tmp.getViaje().getId());
        }
        
        comprobanteDTO.setFcancelacion(tmp.getFcancelacion());
        comprobanteDTO.setAdelanto(tmp.getAdelanto());

//        ComprobanteVO comprobanteVO = comprobanteDao.get(voId);
//        System.out.println("comprobante; "+comprobanteVO.getCliente().getNombre());
//        ComprobanteDTO comprobanteDTO = new ComprobanteDTO();
//        comprobanteDTO.setId(comprobanteVO.getId());
//        comprobanteDTO.setDireccionCliente(comprobanteVO.getCliente().getDireccion());
//        comprobanteDTO.setFingreso(comprobanteVO.getFingreso());
//        comprobanteDTO.setNombreCliente(comprobanteVO.getCliente().getNombre());
//        comprobanteDTO.setNumero(comprobanteVO.getNumero());
//        comprobanteDTO.setRUCCliente(comprobanteVO.getCliente().getRUC());
//        comprobanteDTO.setTotal(comprobanteVO.getTotal());
//        comprobanteDTO.setDetraccion(comprobanteVO.getDetraccion());
//        comprobanteDTO.setIgv(comprobanteVO.getIgv());
//        comprobanteDTO.setMonto(comprobanteVO.getMonto());
//        comprobanteDTO.setTotalsindetraccion(comprobanteVO.getTotalsindetraccion());
//        comprobanteDTO.setTipo_comprobante(comprobanteVO.getTipo_comprobante());
//        comprobanteDTO.setViaje(comprobanteVO.getViaje().getId());
        
        return comprobanteDTO;
    }

    public int getIdByNumero(int numero) {
        List<ComprobanteVO> comprobanteVOs = comprobanteDao.getByNumero(numero);
        if (comprobanteVOs.size() > 0)
            return comprobanteVOs.get(0).getId();
        else return 0;
    }



    public Object getByIndex(int indice) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getIdAtIndex(int indice) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getIndexOf(int voId) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void saveOrUpdate(Object o) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void updateListVo() {
        comprobanteVOs = comprobanteDao.getAll();
    }

    public List<ComprobanteDTO> getAllbySerie() {
        List<ComprobanteVO> comprobanteVOs = comprobanteDao.getAllGroupBySerie();
        List<ComprobanteDTO> comprobanteDTOs = new LinkedList<ComprobanteDTO>();
        for (Iterator<ComprobanteVO> it = comprobanteVOs.iterator(); it.hasNext();) {
            ComprobanteVO comprobanteVO = it.next();
            ComprobanteDTO comprobanteDTO = new ComprobanteDTO(comprobanteVO.getId(),
                    comprobanteVO.getFingreso(),
                    comprobanteVO.getNumero(),
                    comprobanteVO.getNumeroserie(),
                    comprobanteVO.getTotal(),
                    comprobanteVO.getCliente().getId(),
                    comprobanteVO.getCliente().getNombre(),
                    comprobanteVO.getCliente().getDireccion(),
                    comprobanteVO.getCliente().getRuc(),
                    comprobanteVO.getMonto(),
                    comprobanteVO.getIgv(),
                    comprobanteVO.getTotalsindetraccion(),
                    comprobanteVO.getDetraccion(),
                    comprobanteVO.getTipoComprobante(),
                    comprobanteVO.getFcancelacion(),
                    comprobanteVO.getAdelanto());
            if (comprobanteVO.getViaje() != null) {
                comprobanteDTO.setViaje(comprobanteVO.getViaje().getId());
            }
            comprobanteDTOs.add(comprobanteDTO);

        }
        return comprobanteDTOs;
    }

    public List<Integer> getAllbyAnho() {
        List<Integer> comprobantes = comprobanteDao.getAllGroupByAnho();
        return comprobantes;
    }



    public List<Object> reporteVentas() {
        List<Object> resultadoVentas = comprobanteDao.reporteVentas();
        return resultadoVentas;
    }

}
